package main

import (
	"fmt"
	"errors"
)

//自定义错误
//调用errors包的New函数

func test() error{

	num1 := 10
	num2 := 0

	if num2 == 0{
		return errors.New("divide by zero")
	}else{
		result := num1 / num2
		fmt.Println(result)
		return nil
	}
}

func main(){
	err  := test()
	if err != nil{
		fmt.Println(err)
		panic(err)
	}
	
}

//错误处理	defer + recover
//提高程序健壮性

// func test(){
// 	defer func(){
// 		err := recover()
// 		if err != nil{
// 			fmt.Println("catch error")
// 			fmt.Println(err)
// 		}
// 	}()

// 	fmt.Println("inter test")
	
// 	num1 := 10
// 	num2 := 0
// 	result := num1 / num2
// 	fmt.Println(result)

// 	fmt.Println("test is over")
// }

// func main(){
// 	test()
// 	fmt.Println("sunccess")
// }

// import(
// 	"fmt"
// 	"time"
// )

//日期函数的使用
// func main(){
// 	now := time.Now()
// 	fmt.Println(now)

// 	fmt.Printf("年: %v\n",now.Year())
// 	fmt.Printf("月: %v\n",now.Month())
// 	fmt.Printf("日: %v\n",now.Day())
// 	fmt.Printf("时: %v\n",now.Hour())
// 	fmt.Printf("分: %v\n",now.Minute())
// 	fmt.Printf("秒: %v\n",now.Second())

// 	fmt.Println("-------------------------------")

// 	//根据需求选择任意组合
// 	datestr := now.Format("2006/01/02 15/04/05")	//以这个时间为基准
// 	fmt.Println(datestr)
// }

//import (
// 	"fmt"
// 	"strings"
// )

//字符串函数的使用
// func main(){
	// var str string = "helloworld"

	// fmt.Println(len(str))	//按字节

	// //遍历字符串
	// for i,value := range str{
	// 	fmt.Printf("%d %c\n",i,value)
	// }

	// r := []rune(str)
	// for i := 0;i < len(r);i++{
	// 	fmt.Printf("%c ",r[i])
	// }
	// fmt.Println()

	//字符串转整数
	// num1,_ := strconv.Atoi("666")
	// fmt.Println(num1)

	// str1 := strconv.Itoa(88)
	// fmt.Println(str1)

	//统计字串
	// count := strings.Count("aaaaaaaaijinijasf","ij")
	// fmt.Println(count)

	//不区分大小写的字符串比较
	// fmt.Println(strings.EqualFold("hello","HELLO"))
	// //区分大小写的字符串比较
	// fmt.Println("hello" == "HELLO")

	//查找首次出现的索引
	//fmt.Println(strings.Index("cppandgolang","go"))

	//按某个字符切割字符串
// 	arr := strings.Split("go-cpp-java","-")
// 	fmt.Println(arr)
// }

// func add(num1 int,num2 int) int{
// 	defer fmt.Println("num1 =",num1)
// 	defer fmt.Println("num2 =",num2)

// 	num1 += 10
// 	num2 += 20

// 	//函数执行完毕后才从栈中取出语句执行
// 	//对应的值一并拷入栈中，因此不会变化

// 	var sum int = num1 + num2
// 	fmt.Println("sum =",sum)
// 	return sum
// }

// func main(){
// 	fmt.Println(add(10,20))
// }

// func getSum() func (int) int {
// 	var sum int = 0
// 	return func (num int) int{
// 		sum = sum + num
// 		return sum
// 	}
// }

// //闭包：返回的匿名函数 + 匿名函数以外的变量
// //sum会一直保存在内存之中
// func main(){
// 	f := getSum();
// 	fmt.Println(f(1))
// 	fmt.Println(f(2))
// 	fmt.Println(f(3))
// }

// func main(){
// 	//定义匿名函数
// 	ret := func (num1 int,num2 int) int{
// 		return num1 + num2
// 	}(10,20);

// 	fmt.Println(ret)
// }

// import(
// 	"fmt"
// 	"gocode/text.4.15/cal"
// )

// var num int = test()

// func test() int{
// 	fmt.Println("test函数执行")
// 	return 10
// }

// func init(){
// 	fmt.Println("init函数执行")
// }

// func main(){
// 	fmt.Println("main函数执行")
// 	cal.Add(10,20)
// }

// func test(args...int){
// 	for i := 0;i < len(args);i++{
// 		fmt.Println(args[i])
// 	}
// }

// func add(num1 int,num2 int) int {
// 	return num1 + num2
// }

// func ret(num1 int,num2 int) (re1 int,re2 int){
// 	re1 = num2
// 	re2 = num1
// 	return
// }

// func main(){

// 	var n1,n2 int = ret(20,30)

// 	fmt.Println(n1,n2);

// 	fmt.Println(cal.Add(n1,n2))

// 	//a := test	//用函数给变量赋值

// 	// type myfunc func(int,int) int

// 	// var f myfunc = add;

// 	// fmt.Println(f(20,30))

// 	// fmt.Printf("a的类型是: %T,test函数的类型是:%T\n",a,test);
// 	// a(19,129,999)
// }

// func main(){
// 	test(10,23,425,52,22)
// }